"""
Web API接口模块
提供基于HTTP的POST请求接口
"""

from flask import Flask, request, jsonify
import base64
import numpy as np
from io import BytesIO
from PIL import Image
import face_recognition

from ..modules.face_detection import detect_faces
from ..modules.face_features import extract_face_features
from ..modules.face_matching import recognize_face


def create_api_server():
    """
    创建Web API服务
    :return: Flask应用实例
    """
    app = Flask(__name__)
    
    @app.route('/api/detect', methods=['POST'])
    def detect_face_api():
        """
        人脸检测API接口
        请求格式: POST /api/detect
        请求体: {"image": "base64编码的图片数据"}
        返回格式: {"faces": [{"top": 100, "right": 200, "bottom": 300, "left": 150}]}
        """
        try:
            # 获取请求数据
            data = request.get_json()
            if not data or 'image' not in data:
                return jsonify({"error": "缺少图像数据"}), 400
            
            # 解码base64图像数据
            image_data = base64.b64decode(data['image'])
            image = Image.open(BytesIO(image_data))
            
            # 保存临时文件用于处理
            import os
            # 获取data目录的绝对路径
            data_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), "data")
            # 创建api专属临时文件夹
            api_temp_dir = os.path.join(data_dir, "temp", "api")
            os.makedirs(api_temp_dir, exist_ok=True)
            
            # 使用唯一文件名避免冲突
            temp_path = os.path.join(api_temp_dir, "temp_image.jpg")
            image.save(temp_path)
            
            # 检测人脸
            face_locations = detect_faces(temp_path)
            
            # 删除临时文件
            if os.path.exists(temp_path):
                os.remove(temp_path)
            
            # 格式化返回结果
            faces = []
            for (top, right, bottom, left) in face_locations:
                faces.append({
                    "top": top,
                    "right": right,
                    "bottom": bottom,
                    "left": left
                })
            
            return jsonify({"status": "success", "faces": faces})
        except Exception as e:
            return jsonify({"error": str(e)}), 500
    
    @app.route('/api/recognize', methods=['POST'])
    def recognize_face_api():
        """
        人脸识别API接口
        请求格式: POST /api/recognize
        请求体: {"image": "base64编码的图片数据"}
        返回格式: {"name": "匹配的人名", "confidence": 0.95}
        """
        try:
            # 获取请求数据
            data = request.get_json()
            if not data or 'image' not in data:
                return jsonify({"error": "缺少图像数据"}), 400
            
            # 解码base64图像数据
            image_data = base64.b64decode(data['image'])
            image = Image.open(BytesIO(image_data))
            
            # 保存临时文件用于处理
            import os
            # 获取data目录的绝对路径
            data_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), "data")
            # 创建api专属临时文件夹
            api_temp_dir = os.path.join(data_dir, "temp", "api")
            os.makedirs(api_temp_dir, exist_ok=True)
            
            # 使用唯一文件名避免冲突
            temp_path = os.path.join(api_temp_dir, "temp_image.jpg")
            image.save(temp_path)
            
            # 提取人脸特征
            face_encodings = extract_face_features(temp_path)
            
            # 删除临时文件
            if os.path.exists(temp_path):
                os.remove(temp_path)
            
            # 检查是否检测到人脸
            if len(face_encodings) == 0:
                return jsonify({"status": "success", "results": []})
            
            # 这里应该有一个数据库来比对，这里简化处理
            # 在实际应用中，应该加载人脸数据库进行比对
            results = []
            for encoding in face_encodings:
                # 模拟识别结果
                result = {
                    "name": "示例人名",
                    "confidence": 0.95
                }
                results.append(result)
            
            return jsonify({"status": "success", "results": results})
        except Exception as e:
            return jsonify({"error": str(e)}), 500
    
    return app